๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์ค๊ณ ๋ฐ ๊ด๊ณ ์ดํดํ๊ธฐ (PK, FK, Unique)
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ์ ์์์ ํ ์ด๋ธ์ ๋ง๋ค๊ณ ๊ทธ๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋๋ค. ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๊ณณ์ ๋์ด, ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์งํค๊ณ ํจ์จ์ ์ผ๋ก ์กฐํํ๊ธฐ ์ํ ํต์ฌ ๊ฐ๋ ๋ค์ ์ ๋ฆฌํฉ๋๋ค.
1. ํ ์ด๋ธ ์ ์ฝ ์กฐ๊ฑด (Constraints)
๋ฐ์ดํฐ๊ฐ ์ ํํ๊ณ ์์ ํ๊ฒ ๋ณด๊ด๋๋๋ก ๊ฐ์ ํ๋ ๊ท์น๋ค์ ๋๋ค.
โ Primary Key (PK, ๊ธฐ๋ณธํค)
- ์ญํ : ๊ฐ ํ(Row)์ ์ ์ผํ๊ฒ ์๋ณํ ์ ์๋ ์ ๋ถ์ฆ ๋ฒํธ์ ๊ฐ์ต๋๋ค.
- ํน์ง: ์ค๋ณต๋ ์ ์์ผ๋ฉฐ,
NULL๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. ํ ์ด๋ธ๋น ํ๋๋ง ์ค์ ๊ฐ๋ฅํฉ๋๋ค.
โก Foreign Key (FK, ์ธ๋ํค)
- ์ญํ : ํ ํ ์ด๋ธ์ ์ปฌ๋ผ์ด ๋ค๋ฅธ ํ ์ด๋ธ์ PK๋ฅผ ์ฐธ์กฐํ๋๋ก ์ฐ๊ฒฐํฉ๋๋ค.
- ํน์ง: ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ํ์ฑํ๋ฉฐ, ๋ถ๋ชจ ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ด๋ธ์ ๋ฃ์ ์ ์๊ฒ ๋ง์ '๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ'์ ์ ์งํฉ๋๋ค.
โข Unique Key (๊ณ ์ ํค)
- ์ญํ : ์ค๋ณต๋ ๊ฐ์ ํ์ฉํ์ง ์์ต๋๋ค.
- ์ฐจ์ด์ : PK์ ๋ฌ๋ฆฌ
NULL๊ฐ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ํ ํ ์ด๋ธ์ ์ฌ๋ฌ ๊ฐ ์ค์ ํ ์ ์์ต๋๋ค. (์: ์ด๋ฉ์ผ, ์ ํ๋ฒํธ)
2. ํ ์ด๋ธ ์์ฑ, ์์ , ์ญ์ (DDL)
-- 1. ํ
์ด๋ธ ์์ฑ (CREATE)
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY, -- PK ์ค์
email VARCHAR(255) NOT NULL UNIQUE, -- Unique ์ค์
name VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE orders (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT, -- FK๋ก ์ฌ์ฉํ ์ปฌ๋ผ
order_date DATE,
-- FK ์ ์ฝ ์กฐ๊ฑด ์ถ๊ฐ: orders์ user_id๋ users์ id๋ฅผ ์ฐธ์กฐํ๋ค
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 2. ํ
์ด๋ธ ์์ (ALTER)
ALTER TABLE users ADD COLUMN phone VARCHAR(20); -- ์ปฌ๋ผ ์ถ๊ฐ
ALTER TABLE users MODIFY COLUMN name VARCHAR(200); -- ์ปฌ๋ผ ์์
-- 3. ํ
์ด๋ธ ์ญ์ (DROP)
DROP TABLE orders; -- ํ
์ด๋ธ ํต์งธ๋ก ์ญ์ 3. ํ ์ด๋ธ ๊ฐ์ ๊ด๊ณ (Relationships) ์์ธ ๋ถ์
ํ์ค ์ธ๊ณ์ ๋ณต์กํ ๋ฐ์ดํฐ ์ฐ๊ฒฐ ๊ตฌ์กฐ๋ฅผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ น์ฌ๋ด๋ 3๊ฐ์ง ๋ฐฉ์์ ๋๋ค.
โ 1:N ๊ด๊ณ (์ผ๋๋ค, One-to-Many) - ๊ฐ์ฅ ๋ณดํธ์
ํ ์ชฝ ์ํฐํฐ๊ฐ ๋ค๋ฅธ ์ชฝ ์ํฐํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง ์ ์๋ ๊ตฌ์กฐ์ ๋๋ค.
- ์์: ๋ถ์(1) : ์ง์(N), ๊ฒ์๊ธ(1) : ๋๊ธ(N), ๊ณ ๊ฐ(1) : ์ฃผ๋ฌธ(N)
- ๊ตฌํ ๋ฐฉ๋ฒ: 'N' ์ชฝ ํ
์ด๋ธ์ '1' ์ชฝ์ PK๋ฅผ FK(์ธ๋ํค)๋ก ์ถ๊ฐํฉ๋๋ค.
- ์๊ฐํด๋ณด๊ธฐ: ์ง์ ํ ์ด๋ธ์ '๋ถ์ ID'๊ฐ ์ ํ ์์ด์ผ, ์ด ์ง์์ด ์ด๋ ๋ถ์ ์์์ธ์ง ์ ์ ์์ต๋๋ค.
โก 1:1 ๊ด๊ณ (์ผ๋์ผ, One-to-One)
๋ ํ ์ด๋ธ์ ํ์ด ์๋ก ์ ํํ ํ๋์ฉ๋ง ๋์๋๋ ๊ตฌ์กฐ์ ๋๋ค.
- ์์: ์ฌ์ฉ์(1) : ์ฌ์ฉ์ ์์ธ ํ๋กํ(1), ๊ตญ๊ฐ(1) : ์๋(1)
- ๊ตฌํ ๋ฐฉ๋ฒ: ์ด๋ ํ ์ชฝ ํ ์ด๋ธ์ ์๋๋ฐฉ์ PK๋ฅผ FK๋ก ๋ฃ์ต๋๋ค. (์ด๋ ํด๋น FK๋ UNIQUE ์ ์ฝ์กฐ๊ฑด์ด ํ์์ ๋๋ค.)
- ์ฌ์ฉ ์ด์ : ๋ณด์์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ถ๋ฆฌํ๊ฑฐ๋, ํ ์ด๋ธ์ด ๋๋ฌด ์ปค์ ธ์ ์ฑ๋ฅ ๊ด๋ฆฌ๋ฅผ ์ํด ์ชผ๊ฐ์ผ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
โข N:M ๊ด๊ณ (๋ค๋๋ค, Many-to-Many)
์์ชฝ ์ํฐํฐ๊ฐ ์๋ก๋ฅผ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง ์ ์๋ ๊ตฌ์กฐ์ ๋๋ค.
- ์์: ํ์(N) : ๊ฐ์(M), ํฌ์คํธ(N) : ํ๊ทธ(M)
- ์ค์: RDBMS์์๋ ๋ ํ ์ด๋ธ๋ง์ผ๋ก๋ N:M์ ์ง์ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ฐ๋์ **'์ฐ๊ฒฐ ํ ์ด๋ธ(Mapping/Junction Table)'**์ด ์ค๊ฐ์ ํ์ํฉ๋๋ค.
- ๊ตฌํ ๋ฐฉ๋ฒ:
ํ์๊ณผ๊ฐ์์ฌ์ด์์๊ฐ์ ์ฒญ์ด๋ผ๋ ํ ์ด๋ธ์ ๋ง๋ค๊ณ , ์ฌ๊ธฐ์ํ์_ID์๊ฐ์_ID๋ฅผ ๊ฐ๊ฐ FK๋ก ๋ด์ต๋๋ค.- ๊ฒฐ๊ณผ: ์ฐ๊ฒฐ ํ
์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด
ํ์ : ์๊ฐ์ ์ฒญ์ 1:N,๊ฐ์ : ์๊ฐ์ ์ฒญ๋ 1:N ๊ด๊ณ๊ฐ ๋์ด ๋ค๋๋ค๋ฅผ ํด๊ฒฐํฉ๋๋ค.
- ๊ฒฐ๊ณผ: ์ฐ๊ฒฐ ํ
์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด
4. ๊ด๊ณ ์ค์ ์ ํต์ฌ: ์ธ๋ํค ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ (Cascading)
๋ถ๋ชจ ๋ฐ์ดํฐ(1)๊ฐ ์์ ๋๊ฑฐ๋ ์ญ์ ๋ ๋, ์ฐ๊ฒฐ๋ ์์ ๋ฐ์ดํฐ(N)๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํ๋ ์ต์ ์ ๋๋ค.
- ON DELETE CASCADE: ๋ถ๋ชจ๋ฅผ ์ง์ฐ๋ฉด ์์๋ ํจ๊ป ์ญ์ ๋ฉ๋๋ค. (์: ๊ฒ์๊ธ ์ญ์ ์ ๋๊ธ๋ ์ญ์ )
- ON DELETE SET NULL: ๋ถ๋ชจ๋ฅผ ์ง์ฐ๋ฉด ์์์ FK ๊ฐ์ NULL๋ก ๋ณ๊ฒฝํฉ๋๋ค. (์: ๋ถ์ ์ญ์ ์ ์ง์์ ๋จ๊ฒจ๋๊ณ ๋ถ์ ์ ๋ณด๋ง ๋น์)
- ON DELETE RESTRICT: ์์์ด ๋จ์์์ผ๋ฉด ๋ถ๋ชจ๋ฅผ ์ง์ธ ์ ์๊ฒ ๋ง์ต๋๋ค. (๊ธฐ๋ณธ๊ฐ, ๋ฐ์ดํฐ ๋ณดํธ์ฉ)
5. ์ฉ์ด ์ ๋ฆฌ Q&A
- Q: PK๋ ๊ผญ ์ซ์๋ก ํด์ผ ํ๋์?
- A: ์ฃผ๋ก
AUTO_INCREMENT์ซ์๋ฅผ ์ฐ์ง๋ง, UUID ๊ฐ์ ๊ณ ์ ๋ฌธ์์ด์ ์ฐ๊ธฐ๋ ํฉ๋๋ค. ๋ค๋ง ์ธ๋ฑ์ค ์ฑ๋ฅ์ ์ซ์๊ฐ ์ ๋ฆฌํฉ๋๋ค.
- A: ์ฃผ๋ก
- Q: FK๊ฐ ์์ด๋ JOIN์ ๋๋๋ฐ ์ FK๋ฅผ ์ฐ๋์?
- A: FK๋ '๋ฐ์ดํฐ์ ์์ ๋ง'์ ๋๋ค. ์ค์๋ก ๋ถ๋ชจ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ฑฐ๋, ์ฃผ๋ฌธ ๋ด์ญ์ด ์๋๋ฐ ์ฌ์ฉ์๋ฅผ ์ง์๋ฒ๋ฆฌ๋ ๋ถ์์ฌ๋ฅผ ๋ง์์ค๋๋ค.
- Q: INDEX์ UNIQUE์ ์ฐจ์ด๋?
- A: UNIQUE๋ ์ค๋ณต ๋ฐฉ์ง๊ฐ ๋ชฉ์ ์ด๊ณ , INDEX๋ ์กฐํ ์๋ ํฅ์์ด ๋ชฉ์ ์ ๋๋ค. (๋ณดํต UNIQUE ์ค์ ์ ์๋์ผ๋ก INDEX๊ฐ ์์ฑ๋ฉ๋๋ค.)
๊ฒฐ๋ก
์ข์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ๋ ๋์ค์ ์ฟผ๋ฆฌ๋ฅผ ์ง๋ ์๊ณ ๋ฅผ ์ ๋ฐ ์ดํ๋ก ์ค์ฌ์ค๋๋ค. PK๋ก ์๋ณํ๊ณ , FK๋ก ์ฐ๊ฒฐํ๋ฉฐ, ๊ด๊ณ์ ๋ง๋ ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ๋ ์ต๊ด์ ๋ค์ด์ธ์!